#!/usr/bin/python

## first way ##
import fib_module
print fib_module.calc_fib(n)

## second way ##
f= open ("fib.txt",'r')  # import and read from a text file
# don't think single and double quotes make a difference in python. 

i = f.readlines()
# at this point, could just use:  i(5) 
# but how to do it (in a longer way) by using a while loop?

# use a colon at the beginning of a function definition (no curly brackets as in other languages)
while counter <  n :
	fib_we_want = L[counter].strip()  # to take off the newlines
	counter += 1  #same as counter = counter + 1  (counter++ does not work in python)
print fib_we_want

## third way: use a list ##

L = []  # don't have to allocate memory or anything.
# L[0] = 1   you cannot do this,  as you would in matlab. 

L.append(1)
L.append(2)

# let's use a for loop! 
for i in range(1,n+1):  # range chops off the last guy
	next_num = L[-1] + L[-2]  #trick to get the last and the second to last entry from the list.
	L.append(next_num)

print L[n-1]

## fourth way ... using recursion: ##

def recfib(n):
	# 1. stop condition
	if n == 1:
		return 1
	if n == 2:
		return 2

	# 2. self reference
		return_num = recfib(next_num-1) + recfib(next_num-2)
	# 3.  operate and return answer
		return return_num

## fifth way is speedy! ##
# why the fourth way was a classical BAD EXAMPLE of recursion:
# think: how many times will you call the function with the number 7 ? 
# 10 will call 9 and 8. 9 will then call 8 and 7, and 8 will call 7 and 6. 
# so you are calculating the same value over and over !

steve_dict = {}
def recfib_hash(n,steve_dict):
	# 1. stop condition
	if n == 1:
		return 1
	if n == 2:
		return 2

	# another stop condition
	if steve_dict.has_key(next_num):   # has_key method asks if 
		return steve_dict[next_num]

	# 2. self reference
		return_num = recfib_hash(next_num-1,steve_dict) + recfib_hash(next_num-2,steve_dict)
		# function doesn't have the power to change the global variable, we should pass it along

	# 2a.  store this value in the dictionary
	steve_dict[next_num] = return_num

	# 3.  operate and return answer
		return return_num

print recfib_hash[n,{}]
